// import { testProxy, arrExpand } from "./proxy"; // ES6 导入语法
const { testProxy, arrExpand } = require("../instance/proxy");

testProxy.age = 234;
console.log("testProxySet :>> ", testProxy.age);
console.log("testProxy :>> ", testProxy);

const arr1 = [1, 2, 3, 4, 5, 6];
const arr = {
  id: 123,
  name: "seafwg",
};
const at = arrExpand(arr1);
console.log("arr :>> ", arr1);
console.log("at[-1] :>> ", at[-1]);
console.log("at[1] :>> ", at[1]);

// 数据转换：
// ['seaf-wg', 'assass-in', 'intel-wisd']
// => [{name: 'Seaf Wg'}, {name: 'Assass In'}, {name: 'Interl wisd'}]

const arr2Obj = (arr) => {
  let newArr = [];
  arr.map((item) => {
    let temp = item.split("-");
    let temp2 = [];
    temp.map((itemIn) => {
      temp2.push(itemIn[0].toUpperCase() + itemIn.slice(1));
    });
    newArr.push({ name: temp2.join(" ") });
  });

  return newArr;
};

let arr0 = ["seaf-wg", "assass-in", "intel-wisd"];
console.log(arr2Obj(arr0));

// var a = ??
// if(a == 1 && a == 12) {console.log('suss')}
let a1 = new Proxy(
  {
    a: 1,
    i: 1,
  },
  {
    get: (obj, prop, item) => {
      console.log("obj :>> ", obj);
      console.log("item :>> ", item);
      if (a1.i == 1) {
        return obj[prop];
      } else {
        return 12;
      }
    },
  }
);

// let b = a1.a;
// console.log("b :>> ", b);
//对象类型在使用双等号时,会涉及到隐式转换，在执行a==1时首先会调用Valueof方法进行判断，不行则继续调用toString()，然后再把toString返回的字符串转化为数字类型继续和a作比较。
//使用 == 号时ValueOf方法的优先级会比较高，并且每使用一次 == 号都会进行一次toSrting的方法判断。这是将a为对象时的解决方法。还可以使用Object的defineProperty方法，首先将a声明为全局变量，那么此时a为window中的属性，使用此方法可以进行监听a，也可解决此题目。
var a = {
  i: 1,
  valueOf: () => {
    // valueOf 等同于 toString,但是valueOf的优先级高于toString
    // return a.i++;
    if (a.i == 1) {
      a.i++;
      return 1;
    } else {
      return 12;
    }
  },
};

if (a == 1 && a == 12) {
  console.log("a :>> ", "succ");
}

// valueOf的权限比toString高
var c = {
  i: 1,
  // valueOf: () => {
  //   console.log("valueOf() :>> ");
  //   return 1;
  // },
  // toString: () => {
  //   console.log("toString() :>> ");
  //   return 2;
  // },

  toString: () => {
    // return a.i++;
    if (c.i == 1) {
      c.i++;
      return 1;
    } else {
      return 12;
    }
  },
};

// 以下代码没有输出：
if (c == 1 && c == 12) {
  console.log("succ");
}

var d = 1;
Object.defineProperty({}, "d", {
  get() {
    return d++;
  },
});

if (d == 1 && d == 2) {
  console.log("d >>> succ...");
}

const objInterCept = () => {
  return new Proxy(
    {
      a: 1,
      i: 1,
    },
    {
      get: (obj, prop, itemObj) => {
        console.log("obj:", obj);
        console.log("prop:", prop);
        console.log("itemObj:", itemObj);
        if (obj.i == 1) {
          obj.i++;
          return obj.a;
        } else {
          return 2;
        }
        // return curObj[prop]++;
      },
      set: (obj, prop, val) => {
        return (obj[prop] = val);
      },
    }
  );
};
// var aa = objInterCept().a;
console.log("aa>>>=========================================");
if (objInterCept().a == 1 && objInterCept().a == 2) {
  console.log("aaa>>>aaa", aa);
}
